package com.xjie.ui;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ClientReaderThread extends Thread{

    private Socket socket;
    private DataInputStream dis;
    private ClientChatFrame win;
    public ClientReaderThread(Socket socket,ClientChatFrame win)
    {
        this.win = win;
        this.socket = socket;
    }

    @Override
    public void run ()
    {
        try {
            /**
             * 接收的消息可能有很多形式
             *             1.登录消息(昵称)
             *             2.群聊消息
             *             3.私聊消息
             *             所以客户端必须声明协议发送消息
             *             比如客户端先发1，代表接下来是登录消息。
             *             比如客户端先发2，代表接下来是群聊消息。
             *             比如客户端先发3，代表接下来是私聊消息。
             *             先从socket管道中接收客户端发送来的消息类型编号
             */
             dis = new DataInputStream(socket.getInputStream());
            while (true) {
                int msgType = dis.readInt();
                switch (msgType) {
                    case 1:
                        //服务端发来的在线人数更新消息
                        // 接下来要接收昵称数据
                        // 再更新全部在线客户端的在线人数列表
                        //把这个登录成功的客户端socket存入到在线集合。
                        updateClientOnLineUserList();
                        break;
                    case 2:
                        // 服务端发来的群聊消息
                        // 接收群聊消息内容
                        // 把群聊消息转发给全部在线客户端
                        getMsgToWin();
                        break;
                    case 3:
                        // 私聊消息
                        // 接收私聊消息内容
                        // 把私聊消息转发给指定客户端
                        break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            }
    }

    private void getMsgToWin() throws Exception{
        String msg = dis.readUTF();
        win.setMsgToWin(msg);
    }

    //更新客户端的在线用户列表
    private void updateClientOnLineUserList () throws Exception {
        //1.读取有多少个在线用户
        int count = dis.readInt();

        //2.循环控制读取多少个用户信息。
        String[] onLineNames = new String[count];
        for (int i = 0; i < count; i++) {
            //3.读取每个用户信息
            String nickname = dis.readUTF();
            //4.将每个用户信息添加到数组
            onLineNames[i] = nickname;
        }

        //5.更新到窗口界面上的的右侧展示出来
        win.updateOnlineUsers(onLineNames);

    }


}
